package com.viewpager.customview;

import android.content.Context;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

/**
 * Created by lgs on 2018/3/20.
 * ViewGroup事件的消耗和传递主要由下面三个方法实现
 * <p>
 * dispatchTouchEvent方法用于事件的分发，Android中所有 的事件必须经过这个方法的分发，然后
 * 决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发，事件没有被消费。
 * 返回false则继续往下分发，如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截事件。
 * <p>
 * onTouchEvent方法用于事件的处理，返回true表示消费处理当前事件，返回false则不处理，交给子控件进行
 * 继续分发。
 */

public class MyViewPager extends ViewGroup {

    private float startX;
    private int currentIndex;

    /**
     * 手势识别器
     * 1、定义出来
     * 2、实例化-把想要的方法给重写
     * 3、在onTouchEvent()把事件传递给手势识别器
     *
     * @param context
     */
    private GestureDetector gestureDetector;

    public MyViewPager(Context context) {
        this(context, null);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        initView(context);
    }

    public MyViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onLayout(boolean b, int left, int top, int right, int bottom) {

        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view = getChildAt(i);

            view.layout(i * getWidth(), 0, (i + 1) * getWidth(), getHeight());
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.CUPCAKE)
    private void initView(final Context context) {
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {

            @Override
            public void onLongPress(MotionEvent e) {
                super.onLongPress(e);
                Toast.makeText(context, "手势识别器长按", Toast.LENGTH_SHORT).show();
            }

            /**
             *
             * @param e1    一按下的时候的事件
             * @param e2    一滑动的时候的事件
             * @param distanceX 对X轴滑动了的距离
             * @param distanceY 对Y轴滑动了的距离
             * @return
             */
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                scrollBy((int) distanceX, 0);
                return true;
            }

            @Override
            public boolean onDoubleTap(MotionEvent e) {
                return super.onDoubleTap(e);
            }

        });
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        //3、把事件传递给手势识别器
        gestureDetector.onTouchEvent(event);
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //1.记录坐标
                startX = event.getRawX();
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                //2.来到新的坐标
                float endX = event.getX();

                //下标位置
                int tempIndex = currentIndex;
                /*
                 * 朝左边滑动时startX大于endX
                 */
                if ((startX - endX) > getWidth() / 2) {
                    //显示下一个页面
                    tempIndex++;
                 /*
                  *朝右边滑动时endX大于startX
                  */
                } else if ((endX - startX) > getWidth() / 2) {
                    //显示上一个页面
                    tempIndex--;
                }
                showCurrentView(tempIndex);
                break;
        }

        return true;
    }

    private void showCurrentView(int tempIndex) {
        /*
        边界值处理
         */
        if (tempIndex < 0) {
            tempIndex = 0;

        } else if (tempIndex > getChildCount() - 1) {
            tempIndex = getChildCount() - 1;
        }
        //纠正当前值
        currentIndex = tempIndex;

        //定位到某个页面
        scrollTo(currentIndex * getWidth(), 0);
    }

    /**
     * 如果当前方法，返回true，拦截事件，将会触发当前控件的
     * onTouchEvent()方法；
     * 如果当前方法，返回false，不拦截事件，事件继续传递给孩子
     *
     * @param ev
     * @return
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean result = false; //默认传递给孩子
        float startX = 0, startY = 0;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = ev.getRawX();
                startY = ev.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                //记录结束值
                float endX = ev.getRawX();
                float endY = ev.getRawY();

                //3.计算绝对值
                float distanceX = Math.abs(endX - startX);
                float distanceY = Math.abs(endY - startY);

                if (distanceX > distanceY && distanceX > 5) {   //说明是左右滑动
                    result = true;
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return result;
    }
}
